Adding ICPC Live Archive
[andmenj-acm.git] / ICPC Live Archive / 3928 - Ballroom lights / help / gomox.ar-pap-2010-d9b17e5cb110 / tpc / doc / rmq.tex
blob6236eaadc3823b068a31c601bafd45ee87aff94c
1 \section{11235 - Frequent values}
2 \textbf{Problema:} Dado un arreglo de números ordenados de forma no decreciente, y un par de indices $i$, $j$; encontrar la mayor frecuencia (repeticiones de un numero) en el rango $[i,j]$ del arreglo.
4 \subsection{Resolución}
5 Dado que el arreglo esta ordenado, las apariciones de un número están todas juntas. En otras palabras, si $k$ está en el arreglo, vale que:
7 $\exists i,j / k \notin a[0..i-1] \wedge \forall t \in a[i..j], a[t] = k \wedge k \notin a[j+1..n]$
9 Esto es útil porque significa que todas las apariciones de un elemento están juntas,
10 es decir que en el arreglo los elementos iguales están en subarreglos. Podemos
11 considerar entonces el arreglo que se obtiene de considerar las longitudes de esos
12 subarreglos (consideramos subarreglos máximos - los que abarcan todas las apariciones
13 de un elemento). Por ejemplo, si el arreglo original es:
14 $$a = -1, -1, 1, 1, 1, 1, 3, 10, 10, 10$$
15 el arreglo de las cantidades es:
16 $$c = 2, 4, 1, 3$$
18 Definimos además:
20 $s(i) = k \longleftrightarrow c[k]$ representa al subarreglo que contiene a los elementos que son iguales a $a[i]$
22 $d(i) = 0 \longleftrightarrow \forall 0 \leq t \leq i, a[t] = a[i] $
24 $d(i) = k > 0 \longleftrightarrow a[k] = a[i] \wedge a[k-1] < a[i]$
27 $h(i) = n - 1 \longleftrightarrow \forall i \leq t < n, a[t] = a[i] $
29 $h(i) = k < n -1 \longleftrightarrow a[k] = a[i] \wedge a[k+1] > a[i]$
31 Intuitivamente, $d(i)$ y $h(i)$ son los extremos del intervalo en a, tal que $\forall d(i) \leq t \leq h(i), a[t] == a[i]$. Notemos entonces que vale que:
33 $\forall i,j / s(i) = s(j) \Rightarrow d(i)=d(j) \wedge h(i)=h(j)$
35 Esto es así ya que si $s(i) = s(j)$, se desprende que $a[i] = a[j]$
37 El arreglo $c$ es útil para resolver el problema. Si tenemos que dar la máxima frecuencia
38 en $[i,j]$, puede pasar que:
39 \begin{itemize}
40 \item $a[i] = a[j]$, con lo cual la máxima frecuencia es el largo de $[i,j]$
41 \item $a[i] \neq a[j]$, en este caso podemos usar el arreglo $c$ para hacer una consulta
42 por el máximo en el intervalo $[s(i)..s(j)]$. Esto sólo es cierto si $i$ es el extremo
43 izquierdo de un subarreglo de $a$, y $j$ es el extremo derecho de otro.
45 Si esto no se cumple, hay que considerar que del subarreglo que corresponde
46 a $i$ o a $j$ sólo importa una parte.
48 Entonces, la máxima frecuencia se puede obtener como:
49 $$max(\Vert [i..h(i)] \Vert, \Vert [d(j)..j] \Vert, max(c[s(i)+1...s(j)-1]))$$
51 Esto corresponde al máximo entre la cantidad de valores iguales a $a[i]$ que caen en el
52 intervalo pedido, la cantidad de valores iguales a $a[j]$ y la máxima frecuencia entre ellos.
53 \end{itemize}
55 Al cargar el arreglo se pueden computar $s$, $d$, $h$ y $c$, de la siguiente manera:
57 \begin{algorithm}[H]
58 \begin{algorithmic}
59 \caption{Calculo de $s$, $d$, $h$ y $c$ a partir del arreglo ordenado}
60 \PARAMS{arreglo $a$, ordenado de forma no decreciente}
61 \STATE $i = 0$
62 \STATE $actual = a[i]$
63 \STATE $intervalo = 0$
64 \STATE $desde = 0$
65 \STATE $hasta = 0$
66 \STATE $s(i) = intervalo$
67 \STATE $c[intervalo] = 1$
68 \STATE $i = 1$
69 \WHILE{$i < \Vert a \Vert - 1 $}
70 \IF{$actual = a[i-1]$}
71 \STATE $hasta++$
72 \STATE $c[intervalo]++$
73 \ELSE
74 \STATE $h(intervalo) = hasta$
75 \STATE $d(intervalo) = desde$
76 \STATE $intervalo++$
77 \STATE $hasta++$
78 \STATE $desde = hasta$
79 \STATE $actual = a[i]$
80 \STATE $c[intervalo] = 1$
81 \ENDIF
82 \STATE $s(i) = intervalo$
83 \STATE $i++$
84 \ENDWHILE
85 \STATE $h(intervalo) = hasta$
86 \STATE $d(intervalo) = desde$
87 \end{algorithmic}
88 \end{algorithm}
90 Para guardar $s,d$ y $h$ se pueden usar arreglos, e indexar $h y d$ siempre por $s(i)$.
92 Una vez que tenemos esto, queda computar eficientemente el máximo en $c[s(i)+1...s(j)-1]$.
93 Para ello usamos la estructura \textit{\textbf{Sparse Table} }\footnote{http://www.topcoder.com/tc?module=Static\&d1=tutorials\&d2=lowestCommonAncestor}.
95 Una vez construida esta estructura podemos comenzar a responder las consultas. El siguiente es el algoritmo para responderlas:
97 \begin{algorithm}[H]
98 \begin{algorithmic}
99 \caption{Resolución de queries}
100 \PARAMS{$i,j$ indices del arreglo $a$}
101 \IF{s(i) == s(j)}
102 \RETURN $j-i+1$ \COMMENT{$\Vert[i..j]\Vert$}
103 \ELSE
104 \STATE res = $max( h(s(i)) - i +1, j - d(s(j)) + 1)$ \COMMENT{$max(\Vert [i..h(i)] \Vert, \Vert [d(j)..j] \Vert)$}
105 \STATE res = $max(res, rmq(c, h(s(i))+1, d(s(j))-1))$ \COMMENT{usar la sparse table para obtener el maximo en el rango de c}
106 \RETURN res
107 \ENDIF
108 \end{algorithmic}
109 \end{algorithm}
111 Con respecto a la complejidad, primero computamos $s,d,h$ y $c$, lo que podemos hacer en $O(n)$ mientras
112 cargamos los números. Luego armamos la \textit{sparse table} para el arreglo $c$, que tiene $O(n)$ elementos
113 (pueden ser $n$, si todos los elementos de $a$ son distintos). Por lo tanto, la construcción de la tabla es
114 $O(n \log n)$. Usando el algoritmo antes mostrado, podemos responder a las consultas en $O(1)$, ya que la
115 consulta a la tabla cuesta $O(1)$. Por lo tanto, si hay $q$ queries que responder, el orden total del algoritmo
116 es $O(n \log n + q)$. Ajustando un poco el calculo, vemos que la tabla no tiene siempre $O(n*\log n)$ posiciones,
117 sino que tiene $O(d*\log d)$ posiciones, donde $d$ es la cantidad de elementos distintos. Si bien $O(d*\log d)
118 \subseteq O(n*\log n)$, potencialmente $d$ es más chico que $n$. Considerando que igualmente deben cargarse
119 todos los valores del arreglo original, el orden es $O(n + d*\log d + q)$.
121 \subsection{Implementación}
122 \noindent
123 \ttfamily
124 \shorthandoff{"}\\
125 \hlstd{}\hlline{\ 1\ }\hldir{\#include\ $<$iostream$>$}\\
126 \hlline{\ 2\ }\hlstd{}\hldir{\#include\ $<$vector$>$}\\
127 \hlline{\ 3\ }\hlstd{}\hldir{\#include\ $<$list$>$}\\
128 \hlline{\ 4\ }\hlstd{}\hldir{\#include\ $<$stdlib.h$>$}\\
129 \hlline{\ 5\ }\hlstd{}\hldir{\#include\ $<$utility$>$}\\
130 \hlline{\ 6\ }\hlstd{}\hldir{\#include\ $<$cassert$>$}\\
131 \hlline{\ 7\ }\hlstd{}\hldir{\#include\ $<$sys/types.h$>$}\\
132 \hlline{\ 8\ }\hlstd{}\hldir{\#include\ $<$sys/stat.h$>$}\\
133 \hlline{\ 9\ }\hlstd{}\hldir{\#include\ $<$fcntl.h$>$}\\
134 \hlline{10\ }\hlstd{}\hldir{\#include\ $<$stdio.h$>$}\\
135 \hlline{11\ }\hlstd{}\hlkwa{using\ namespace\ }\hlstd{std}\hlsym{;}\\
136 \hlline{12\ }\hlstd{}\hldir{\#define\ forit(it,l)\ for(it=(l).begin();it\ !=\ (l).end();\ it++)}\\
137 \hlline{13\ }\hlstd{}\hldir{\#define\ forn(i,n)\ for(unsigned}\hlstd{\ \ }\hldir{i=\ 0;\ i\ $<$\ ((unsigned)(n));\ i++)}\\
138 \hlline{14\ }\hlstd{}\hldir{\#define\ foreachin(it,s)\ for(typeof((s).begin())\ it\ =\ ((s).begin());\ it\ !=\ ((s).end());\ it++)}\\
139 \hlline{15\ }\hlstd{}\hldir{\#define\ forsn(i,s,n)\ for(int\ i\ =\ (s);\ i\ $<$\ (n);\ i++)}\\
140 \hlline{16\ }\hlstd{}\hlkwb{void\ }\hlstd{}\hlkwc{inline\ }\hlstd{}\hlkwd{llenar\textunderscore tabla}\hlstd{}\hlsym{(}\hlstd{vector}\hlsym{$<$}\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ $>$\&\ }\hlstd{tabla}\hlsym{,\ }\hlstd{}\hlkwb{const\ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\&\ }\hlstd{frec}\hlsym{)\ \{}\\
141 \hlline{17\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{tabla}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
142 \hlline{18\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{i}\hlsym{,\ }\hlstd{j}\hlsym{;}\\
143 \hlline{19\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlslc{//init\ de\ los\ intervalos\ de\ largo\ 1}\\
144 \hlline{20\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn}\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,}\hlstd{n}\hlsym{)}\\
145 \hlline{21\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{tabla}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}\ =\ }\hlstd{i}\hlsym{;}\\
146 \hlline{22\ }\hlstd{\\
147 \hlline{23\ }}\hlstd{\ \ \ \ }\hlstd{}\hlslc{//llenado\ de\ la\ tabla\ desde\ los\ mas\ chicos\ a\ los\ mas\ grandes}\\
148 \hlline{24\ }\hlstd{\ }\hlkwb{unsigned\ }\hlstd{t}\hlsym{=}\hlstd{}\hlnum{2}\hlstd{}\hlsym{;}\\
149 \hlline{25\ }\hlstd{\ }\hlkwb{unsigned\ }\hlstd{t\textunderscore ant}\hlsym{=}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
150 \hlline{26\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{for\ }\hlstd{}\hlsym{(}\hlstd{j\ }\hlsym{=\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{;\ }\hlstd{t\ }\hlsym{$<$=\ }\hlstd{n}\hlsym{;\ }\hlstd{j}\hlsym{++)\ \{}\\
151 \hlline{27\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{for\ }\hlstd{}\hlsym{(}\hlstd{i\ }\hlsym{=\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;\ }\hlstd{i\ }\hlsym{+\ (}\hlstd{t}\hlsym{)\ {-}\ }\hlstd{}\hlnum{1\ }\hlstd{}\hlsym{$<$\ }\hlstd{n}\hlsym{;\ }\hlstd{i}\hlsym{++)\ \{}\\
152 \hlline{28\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{k\ }\hlsym{=\ }\hlstd{j\ }\hlsym{{-}\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
153 \hlline{29\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{frec}\hlsym{{[}}\hlstd{tabla}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]}{]}\ $>$\ }\hlstd{frec}\hlsym{{[}}\hlstd{tabla}\hlsym{{[}}\hlstd{i\ }\hlsym{+\ (}\hlstd{t\textunderscore ant}\hlsym{){]}{[}}\hlstd{k}\hlsym{{]}{]})}\\
154 \hlline{30\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{tabla}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ =\ }\hlstd{tabla}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]};}\\
155 \hlline{31\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{else}\\
156 \hlline{32\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{tabla}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ =\ }\hlstd{tabla}\hlsym{{[}}\hlstd{i\ }\hlsym{+\ (}\hlstd{t\textunderscore ant}\hlsym{){]}{[}}\hlstd{k}\hlsym{{]};}\\
157 \hlline{33\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
158 \hlline{34\ }\hlstd{}\hlstd{\ \ }\hlstd{t\textunderscore ant}\hlsym{=}\hlstd{t}\hlsym{;}\\
159 \hlline{35\ }\hlstd{}\hlstd{\ \ }\hlstd{t}\hlsym{=}\hlstd{t}\hlsym{$<$$<$}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
160 \hlline{36\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
161 \hlline{37\ }\hlstd{}\hlsym{\}}\\
162 \hlline{38\ }\hlstd{}\\
163 \hlline{39\ }\\
164 \hlline{40\ }\hlkwb{static\ }\hlstd{}\hlkwc{inline\ }\hlstd{}\hlkwb{uint32\textunderscore t\ }\hlstd{}\hlkwd{log\textunderscore 2}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ uint32\textunderscore t\ }\hlstd{x}\hlsym{)\ \{}\\
165 \hlline{41\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwb{uint32\textunderscore t\ }\hlstd{y}\hlsym{;}\\
166 \hlline{42\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{asm\ }\hlstd{}\hlsym{(\ }\hlstd{}\hlstr{"}\hlesc{$\backslash$t}\hlstr{bsr\ \%1,\ \%0}\hlesc{$\backslash$n}\hlstr{"}\hlstd{\\
167 \hlline{43\ }}\hlstd{\ \ \ \ \ \ }\hlstd{}\hlsym{:\ }\hlstd{}\hlstr{"=r"}\hlstd{}\hlsym{(}\hlstd{y}\hlsym{)}\\
168 \hlline{44\ }\hlstd{}\hlstd{\ \ \ \ \ \ }\hlstd{}\hlsym{:\ }\hlstd{}\hlstr{"r"}\hlstd{\ }\hlsym{(}\hlstd{x}\hlsym{)}\\
169 \hlline{45\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{);}\\
170 \hlline{46\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{return\ }\hlstd{y}\hlsym{;}\\
171 \hlline{47\ }\hlstd{}\hlsym{\}}\\
172 \hlline{48\ }\hlstd{\\
173 \hlline{49\ }\\
174 \hlline{50\ }\ }\hlkwb{void\ }\hlstd{}\hlkwc{inline\ }\hlstd{}\hlkwd{cargar\textunderscore numeros}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{int\ }\hlstd{cant\textunderscore numeros}\hlsym{,}\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\&\ }\hlstd{frec}\hlsym{,}\hlstd{vector}\hlsym{$<$}\hlstd{pair}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ $>$\&\ }\Righttorque\\
175 \hlline{51\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{intervalostupla}\hlsym{,}\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\&\ }\hlstd{intervaloindice}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{\&\ }\hlstd{intervalo}\hlsym{)\ \{}\\
176 \hlline{52\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{i\ }\hlsym{=\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
177 \hlline{53\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{numero}\hlsym{;}\\
178 \hlline{54\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{desde}\hlsym{,}\hlstd{hasta}\hlsym{;\ }\hlstd{}\hlslc{//intervalo\ donde\ todos\ los\ elementos\ son\ iguales\ {[}\ {]}}\\
179 \hlline{55\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{actual}\hlsym{;\ }\hlstd{}\hlslc{//elemento\ cuya\ frecuencia\ estoy\ construyendo}\\
180 \hlline{56\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{i\ }\hlsym{$<$\ }\hlstd{cant\textunderscore numeros}\hlsym{)\ \{}\\
181 \hlline{57\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf\ }\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d"}\hlstd{}\hlsym{,\&}\hlstd{numero}\hlsym{);}\\
182 \hlline{58\ }\hlstd{\\
183 \hlline{59\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{i\ }\hlsym{==\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ \{}\\
184 \hlline{60\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{actual}\hlsym{=}\hlstd{numero}\hlsym{;}\\
185 \hlline{61\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{desde}\hlsym{=}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
186 \hlline{62\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{hasta}\hlsym{=}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
187 \hlline{63\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
188 \hlline{64\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{actual}\hlsym{==}\hlstd{numero}\hlsym{)\ \{\ }\hlstd{}\hlslc{//si\ son\ iguales,\ incremento\ el\ hasta\ y\ su\ frecuencia}\\
189 \hlline{65\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{hasta}\hlsym{++;}\\
190 \hlline{66\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{frec}\hlsym{{[}}\hlstd{intervalo}\hlsym{{]}++;}\\
191 \hlline{67\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
192 \hlline{68\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//\ si\ son\ distintos,\ se\ cerró\ un\ intervalo,\ hay\ que\ empezar\ a\ armar\ otro}\\
193 \hlline{69\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
194 \hlline{70\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{intervalostupla}\hlsym{{[}}\hlstd{intervalo}\hlsym{{]}\ =\ }\hlstd{pair}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$(}\hlstd{desde}\hlsym{,}\hlstd{hasta}\hlsym{);}\\
195 \hlline{71\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{intervalo}\hlsym{++;}\\
196 \hlline{72\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{hasta}\hlsym{++;}\\
197 \hlline{73\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{desde}\hlsym{=}\hlstd{hasta}\hlsym{;}\\
198 \hlline{74\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{actual\ }\hlsym{=\ }\hlstd{numero}\hlsym{;}\\
199 \hlline{75\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
200 \hlline{76\ }\hlstd{\\
201 \hlline{77\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
202 \hlline{78\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{intervaloindice}\hlsym{{[}}\hlstd{i}\hlsym{{]}=}\hlstd{intervalo}\hlsym{;}\\
203 \hlline{79\ }\hlstd{\\
204 \hlline{80\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{i}\hlsym{++;}\\
205 \hlline{81\ }\hlstd{\\
206 \hlline{82\ }}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
207 \hlline{83\ }\hlstd{\\
208 \hlline{84\ }}\hlstd{\ \ \ \ }\hlstd{}\hlslc{//hack:\ el\ ultimo\ siempre\ quedaba\ sin\ agregar}\\
209 \hlline{85\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{intervalostupla}\hlsym{{[}}\hlstd{intervalo}\hlsym{{]}\ =\ }\hlstd{pair}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$(}\hlstd{desde}\hlsym{,}\hlstd{hasta}\hlsym{);}\\
210 \hlline{86\ }\hlstd{}\hlsym{\}}\\
211 \hlline{87\ }\hlstd{}\\
212 \hlline{88\ }\hlkwb{void\ }\hlstd{}\hlkwc{inline\ }\hlstd{}\hlkwd{procesar\textunderscore queries}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ int\ }\hlstd{queries}\hlsym{,}\hlstd{}\hlkwb{const\ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\&\ }\hlstd{frec}\hlsym{,}\hlstd{}\hlkwb{const\ }\hlstd{vector}\hlsym{$<$}\hlstd{pair}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ $>$\&\ }\Righttorque\\
213 \hlline{89\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{intervalostupla}\hlsym{,}\hlstd{}\hlkwb{const\ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\&\ }\hlstd{intervaloindice}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{\&\ }\hlstd{intervalo}\hlsym{)\ \{}\\
214 \hlline{90\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{vector}\hlsym{$<$}\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ $>$\ }\hlstd{}\hlkwd{tabla}\hlstd{}\hlsym{(}\hlstd{intervalo}\hlsym{+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$(}\hlstd{}\hlkwd{log\textunderscore 2}\hlstd{}\hlsym{(}\hlstd{intervalo}\hlsym{+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{)+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{));}\\
215 \hlline{91\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{llenar\textunderscore tabla}\hlstd{}\hlsym{(}\hlstd{tabla}\hlsym{,}\hlstd{frec}\hlsym{);}\\
216 \hlline{92\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{unsigned\ }\hlstd{x}\hlsym{,}\hlstd{y}\hlsym{;}\\
217 \hlline{93\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{i}\hlsym{=}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
218 \hlline{94\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{i\ }\hlsym{$<$\ }\hlstd{queries}\hlsym{)\ \{}\\
219 \hlline{95\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%u\ \%u"}\hlstd{}\hlsym{,\&}\hlstd{x}\hlsym{,\&}\hlstd{y}\hlsym{);}\\
220 \hlline{96\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{desde}\hlsym{,\ }\hlstd{hasta}\hlsym{;}\\
221 \hlline{97\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//desde\ y\ hasta\ son\ los\ intervalos\ extremos\ que\ hay\ que\ mirar.}\\
222 \hlline{98\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//No\ necesariamente\ estan\ completos}\\
223 \hlline{99\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{desde\ }\hlsym{=\ }\hlstd{intervaloindice}\hlsym{{[}}\hlstd{x}\hlsym{{-}}\hlstd{}\hlnum{1}\hlstd{}\hlsym{{]};}\\
224 \hlline{100\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{hasta\ }\hlsym{=\ }\hlstd{intervaloindice}\hlsym{{[}}\hlstd{y}\hlsym{{-}}\hlstd{}\hlnum{1}\hlstd{}\hlsym{{]};}\\
225 \hlline{101\ }\hlstd{\\
226 \hlline{102\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{res}\hlsym{;}\\
227 \hlline{103\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//\ Si\ esos\ indices\ son\ parte\ del\ mismo\ intervalo,\ la\ frecuencia\ es\ la\ distancia\ entre\ ellos.}\\
228 \hlline{104\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{desde}\hlsym{==}\hlstd{hasta}\hlsym{)\ \{}\\
229 \hlline{105\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{res\ }\hlsym{=\ }\hlstd{y}\hlsym{{-}}\hlstd{x}\hlsym{+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
230 \hlline{106\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
231 \hlline{107\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//calculo\ por\ separado\ los\ intervalos\ que\ pueden\ ser\ truncos}\\
232 \hlline{108\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{frec\textunderscore i\ }\hlsym{=\ }\hlstd{intervalostupla}\hlsym{{[}}\hlstd{desde}\hlsym{{]}.}\hlstd{second\ }\hlsym{{-}\ }\hlstd{x\ }\hlsym{+\ }\hlstd{}\hlnum{2}\hlstd{}\hlsym{;}\\
233 \hlline{109\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{frec\textunderscore j\ }\hlsym{=\ }\hlstd{y\ }\hlsym{{-}\ }\hlstd{intervalostupla}\hlsym{{[}}\hlstd{hasta}\hlsym{{]}.}\hlstd{first\ }\hlsym{;}\\
234 \hlline{110\ }\hlstd{\\
235 \hlline{111\ }}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//el\ siguiente\ del\ desde\ y\ el\ anterior\ del\ hasta\ si\ estan\ completos}\\
236 \hlline{112\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{unsigned\ int\ }\hlstd{intervalo\textunderscore completo\textunderscore i\ }\hlsym{=\ }\hlstd{desde}\hlsym{+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
237 \hlline{113\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{unsigned\ int\ }\hlstd{intervalo\textunderscore completo\textunderscore j\ }\hlsym{=\ }\hlstd{hasta}\hlsym{{-}}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
238 \hlline{114\ }\hlstd{\\
239 \hlline{115\ }}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{res\ }\hlsym{=\ }\hlstd{}\hlkwd{max}\hlstd{}\hlsym{(}\hlstd{frec\textunderscore i}\hlsym{,}\hlstd{frec\textunderscore j}\hlsym{);}\\
240 \hlline{116\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if}\hlstd{}\hlsym{(}\hlstd{intervalo\textunderscore completo\textunderscore i\ }\hlsym{$<$=\ }\hlstd{intervalo\textunderscore completo\textunderscore j}\hlsym{)\{}\\
241 \hlline{117\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{unsigned\ int\ }\hlstd{k\ }\hlsym{=\ }\hlstd{}\hlkwd{log\textunderscore 2}\hlstd{}\hlsym{(}\hlstd{intervalo\textunderscore completo\textunderscore j\ }\hlsym{{-}\ }\hlstd{intervalo\textunderscore completo\textunderscore i\ }\hlsym{+\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{);}\\
242 \hlline{118\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{aux\ }\hlsym{=\ }\hlstd{frec}\hlsym{{[}}\hlstd{tabla}\hlsym{{[}}\hlstd{intervalo\textunderscore completo\textunderscore j}\hlsym{{-}(}\hlstd{}\hlnum{1}\hlstd{}\hlsym{$<$$<$}\hlstd{k}\hlsym{)+}\hlstd{}\hlnum{1}\hlstd{}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]}{]};}\\
243 \hlline{119\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{frec}\hlsym{{[}}\hlstd{tabla}\hlsym{{[}}\hlstd{intervalo\textunderscore completo\textunderscore i}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]}{]}\ $>$=\ }\hlstd{aux\ }\hlsym{)}\\
244 \hlline{120\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{res\ }\hlsym{=\ }\hlstd{}\hlkwd{max}\hlstd{}\hlsym{(}\hlstd{res}\hlsym{,}\hlstd{frec}\hlsym{{[}}\hlstd{tabla}\hlsym{{[}}\hlstd{intervalo\textunderscore completo\textunderscore i}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]}{]});}\\
245 \hlline{121\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{else}\\
246 \hlline{122\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{res\ }\hlsym{=\ }\hlstd{}\hlkwd{max}\hlstd{}\hlsym{(}\hlstd{res}\hlsym{,}\hlstd{aux}\hlsym{);}\\
247 \hlline{123\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
248 \hlline{124\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
249 \hlline{125\ }\hlstd{\\
250 \hlline{126\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,}\hlstd{res}\hlsym{);}\\
251 \hlline{127\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{i}\hlsym{++;}\\
252 \hlline{128\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
253 \hlline{129\ }\hlstd{}\hlsym{\}}\\
254 \hlline{130\ }\hlstd{}\\
255 \hlline{131\ }\hlkwb{int\ }\hlstd{}\hlkwd{main}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{int\ }\hlstd{argc}\hlsym{,\ }\hlstd{}\hlkwb{char}\hlstd{}\hlsym{{*}{*}\ }\hlstd{argv}\hlsym{)\ \{}\hlstd{\ \ }\hlsym{}\\
256 \hlline{132\ }\hlstd{\\
257 \hlline{133\ }}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{cant\textunderscore numeros}\hlsym{,}\hlstd{queries}\hlsym{;}\\
258 \hlline{134\ }\hlstd{\ }\hlkwd{scanf\ }\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d"}\hlstd{}\hlsym{,\&}\hlstd{cant\textunderscore numeros}\hlsym{);}\\
259 \hlline{135\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{\\
260 \hlline{136\ }\\
261 \hlline{137\ }}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{cant\textunderscore numeros\ }\hlsym{$>$\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ \{}\\
262 \hlline{138\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{scanf\ }\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d"}\hlstd{}\hlsym{,\&}\hlstd{queries}\hlsym{);}\\
263 \hlline{139\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ }\hlstd{}\hlkwd{frec}\hlstd{}\hlsym{(}\hlstd{cant\textunderscore numeros}\hlsym{,}\hlstd{}\hlnum{1}\hlstd{}\hlsym{);}\hlstd{}\hlslc{//vector\ de\ frecuencias}\\
264 \hlline{140\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{intervalo\ }\hlsym{=}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\hlstd{}\hlslc{//cantidad\ de\ intervalos}\\
265 \hlline{141\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ }\hlstd{}\hlkwd{intervaloindice}\hlstd{}\hlsym{(}\hlstd{cant\textunderscore numeros}\hlsym{);\ }\hlstd{}\hlslc{//dado\ un\ indice\ del\ arreglo,\ devuelve\ el\ numero\ }\Righttorque\\
266 \hlline{142\ }\hlslc{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlslc{de\ intervalo\ en\ el\ que\ esta}\\
267 \hlline{143\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{vector}\hlsym{$<$}\hlstd{pair}\hlsym{$<$}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{,}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{$>$\ $>$\ }\hlstd{}\hlkwd{intervalostupla}\hlstd{}\hlsym{(}\hlstd{cant\textunderscore numeros}\hlsym{);\ }\hlstd{}\hlslc{//dado\ un\ numero\ de\ intervalo,\ da\ su\ }\Righttorque\\
268 \hlline{144\ }\hlslc{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlslc{desde\ y\ hasta}\\
269 \hlline{145\ }\hlstd{\\
270 \hlline{146\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{cargar\textunderscore numeros}\hlstd{}\hlsym{(}\hlstd{cant\textunderscore numeros}\hlsym{,}\hlstd{frec}\hlsym{,}\hlstd{intervalostupla}\hlsym{,\ }\hlstd{intervaloindice}\hlsym{,\ }\hlstd{intervalo}\hlsym{);}\\
271 \hlline{147\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{procesar\textunderscore queries}\hlstd{}\hlsym{(}\hlstd{queries}\hlsym{,\ }\hlstd{frec}\hlsym{,}\hlstd{intervalostupla}\hlsym{,\ }\hlstd{intervaloindice}\hlsym{,\ }\hlstd{intervalo}\hlsym{);}\\
272 \hlline{148\ }\hlstd{\\
273 \hlline{149\ }\\
274 \hlline{150\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf\ }\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d"}\hlstd{}\hlsym{,\&}\hlstd{cant\textunderscore numeros}\hlsym{);}\\
275 \hlline{151\ }\hlstd{\\
276 \hlline{152\ }}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
277 \hlline{153\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{return\ }\hlstd{}\hlsym{(}\hlstd{EXIT\textunderscore SUCCESS}\hlsym{);}\\
278 \hlline{154\ }\hlstd{}\hlsym{\}}\\
279 \hlline{155\ }\hlstd{}\\
280 \hlline{156\ }\\
281 \mbox{}
282 \normalfont
283 \shorthandon{"}